package test7;

public class Demo3 {
    int[][] memo;

    public static void main(String[] args) {
        int count = new Demo3().numTrees(3);
        System.out.println(count);
    }

    /* 主函数 */
    int numTrees(int n) {
        memo = new int[n + 1][n + 1];
        // 计算闭区间 [1, n] 组成的 BST 个数
        return count(1, n);
    }

    /* 计算闭区间 [lo, hi] 组成的 BST 个数 */
    int count(int lo, int hi) {
        // base case
        if (lo > hi) return 1;
        if (memo[lo][hi] != 0) return memo[lo][hi];
        int res = 0;
        for (int i = lo; i <= hi; i++) {
            // i 的值作为根节点 root
            int left = count(lo, i - 1);
            int right = count(i + 1, hi);
            // 左右子树的组合数乘积是 BST 的总数
            res += left * right;
        }
        memo[lo][hi] = res;
        return res;
    }
}
